
package persistencia;
import dominio.*;
import java.sql.SQLException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;



public class PersistenciaVeiculo {
   // private List<Veiculo> veiculos = new ArrayList<Veiculo>();
        private static PersistenciaVeiculo InstanciaVeiculo;
        private Connection conn;
        
   /**
 * Conexão com o banco de dados
 * 
 */
        private PersistenciaVeiculo () {
                Conecta c = Conecta.getConnection();
                this.conn = c.conn;
        }
	 
/**
 * 
 * Singleton. Usado para que haja apenas uma conexão com o banco sendo usada no sistema
 * 
 */
        public static PersistenciaVeiculo getInstance(){
	if(InstanciaVeiculo == null) {
                        	InstanciaVeiculo = new PersistenciaVeiculo();
	    }
	 return InstanciaVeiculo;
        }     

/* Função que consulta um veículo através da placa
* e retorna todos os atributos dele
* @param veiculo somente com a placa
* @return veiculo
*/
   public Veiculo consultarPlaca(Veiculo veiculo){
        Statement statement;
        ResultSet result;
        try {
            statement = conn.createStatement();
            result = statement.executeQuery("SELECT * FROM Veiculo WHERE nome = "+"'"+veiculo.getPlaca()+"'");
            if (result.next()){
                Veiculo v = new Veiculo(
                        result.getString("placa"), result.getString("marca"), result.getString("modelo"));
                        return v;
            }
            else return null;
        } catch (SQLException ex) {
            System.out.println("Erro em consultar placa");
            //Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
           return null;
        }
    }

/* Função que exclui um veículo
* @param veiculo
*/
    public void excluir(Veiculo veiculo) {
       Statement statement;

        try {
            statement = conn.createStatement();
            statement.executeUpdate("DELETE FROM Veiculo WHERE placa = "+"'"+veiculo.getPlaca()+"'");
        } catch (SQLException ex) {
            System.out.println("Erro em excluir veiculo");
            //Logger.getLogger(PersistenciaCliente.class.getName()).log(Level.SEVERE, null, ex);
        }
}

/* Função que lista todos os veículos
* contidos no banco
* @return listaVeiculos
*/

   public ArrayList<Veiculo> listarVeiculos () {
                ArrayList<Veiculo> veiculos = new ArrayList<Veiculo>();
                Statement statement;
                ResultSet result;
                try {
                        statement = conn.createStatement();
                        result = statement.executeQuery("SELECT * FROM Veiculo");
                        while (result.next()){
                                Veiculo v = new Veiculo(result.getString("placa"), result.getString("marca"),result.getString("modelo"),
                                                                            result.getString("cor"),result.getString("tipo"), result.getString("opcionais"),result.getString("observacoes"));
                                veiculos.add(v);
                        }
                        return veiculos;
                } catch (SQLException e) {
                    System.out.println("Erro em listar veiculos");
                        //Log.getLoginstance(null).error("Ocorreu um erro: "+e.getMessage());
                        return null;
                }
        }

/* Função que cadastra um veiculo no banco de dados

* @return veiculo
*/
    public void cadastroVeiculo (String placa, String marca, String modelo) {
           // String placa, marca, modelo;
            Statement statement;
            
            /*System.out.println("Digite a placa do Veículo: ");
            placa = Console.readString();
            System.out.println("Digite a marca do Veículo:");
            marca = Console.readString();
            System.out.println("Digite o modelo do Veículo:");
            modelo = Console.readString();
*/
            Veiculo veiculo = new Veiculo(placa, marca, modelo);
            if (consultarPlaca(veiculo) == null) {
                    try {
                            statement = conn.createStatement();
                            statement.executeUpdate("INSERT INTO Veiculo (placa, marca, modelo, livre)" +
                                            "values('"+placa+"','"+marca+"','"+modelo+"', '"+1+"')");
                    } catch (SQLException e) {
                        System.out.println(e.getMessage());
                        System.out.println("Erro em cadastro veiculo.");
                         //imprimir erro
                    }
                    System.out.println("Veiculo cadastrado com sucesso!");
               }
                else {
                    System.out.println("Veiculo já cadastrado");
                }
    }

/* Função que altera um cadastro de um veiculo
* @param placa
* @param marca
* @param modelo
*/
    public void alteraCadastroVeiculo(String placa){
         String tipo, aux;
         String cor;
         String opcionais;
         String observacoes;
         Statement statement;

            Veiculo veiculo = new Veiculo(placa, null, null);
            if(consultarPlaca(veiculo) != null) {
                try{
                    
                    System.out.println("Digite a cor do veiculo");
                    cor = Console.readString();
                    System.out.println("Digite o tipo do veiculo");
                    tipo = Console.readString();
                    System.out.println("Digite opcionais sobre o veiculo");
                    opcionais = Console.readString();
                    System.out.println("Digite observacoes sobre o veiculo");
                    observacoes = Console.readString();
                    statement = conn.createStatement();
                    statement.executeUpdate("UPDATE Veiculo SET cor =  '"+cor+"' WHERE placa='"+placa+"'");
                    statement.executeUpdate("UPDATE Veiculo SET tipo =  '"+tipo+"' WHERE placa='"+placa+"'");
                    statement.executeUpdate("UPDATE Veiculo SET opcionais =  '"+opcionais+"' WHERE placa='"+placa+"'");
                    statement.executeUpdate("UPDATE Veiculo SET observacoes =  '"+observacoes+"' WHERE placa='"+placa+"'");
                    } catch (SQLException e) {
                        System.out.println("Erro em alterar cadastro veiculo");
                     //imprime erro
                    }
               }
            else System.out.println("Veiculo não cadastrado. Cadastre-o primeiro.");                         
    }

/* Função que consulta todos os veículos disponíveis
* no momento
* @return listaVeiculos
*/
    public ArrayList<Veiculo> consultaVeiculosDisponiveis() {
                ArrayList<Veiculo> veiculos = new ArrayList<Veiculo>();
                Statement statement;
                ResultSet result;
                try {
                        statement = conn.createStatement();
                        result = statement.executeQuery("SELECT * FROM Veiculo WHERE livre = "+"'"+1+"'");
                        while (result.next()){
                                Veiculo v = new Veiculo(result.getString("placa"), result.getString("marca"),result.getString("modelo"),
                                                                            result.getString("cor"),result.getString("tipo"), result.getString("opcionais"),result.getString("observacoes"));
                                veiculos.add(v);
                                   System.out.println("Placa: "+ result.getString("placa"));
                                   System.out.println("Marca: "+ result.getString("marca"));
                                   System.out.println("Cor: "+ result.getString("cor"));
                                   System.out.println("Tipo: "+ result.getString("tipo"));
                                   System.out.println("Modelo: "+ result.getString("modelo"));
                                   System.out.println("Opcionais: "+ result.getString("opcionais"));
                                   System.out.println("Observacoes: "+ result.getString("observacoes"));
                                   System.out.println();
                        }
                        return veiculos;
                } catch (SQLException e) {
                    System.out.println("Erro em consultar veiculos disponiveis");
                        //Log.getLoginstance(null).error("Ocorreu um erro: "+e.getMessage());
                        return null;
                }
    }

/* Função que consulta e ordena os veículos mais
* procurados até o momento
* @return listaVeiculos
*/
     public ArrayList<Veiculo> consultaVeiculosMaisProcurado() {
                ArrayList<Veiculo> veiculos = new ArrayList<Veiculo>();
                Statement statement;
                ResultSet result;
                try {
                        statement = conn.createStatement();
                        result = statement.executeQuery("SELECT * FROM Veiculo ORDER BY nlocacoes");
                        while (result.next()){
                                Veiculo v = new Veiculo(result.getString("placa"), result.getString("marca"),result.getString("modelo"),
                                                                            result.getString("cor"),result.getString("tipo"), result.getString("opcionais"),result.getString("observacoes"));
                                veiculos.add(v);
                                   System.out.println("Placa: "+ result.getString("placa"));
                                   System.out.println("Marca: "+ result.getString("marca"));
                                   System.out.println("Cor: "+ result.getString("cor"));
                                   System.out.println("Tipo: "+ result.getString("tipo"));
                                   System.out.println("Modelo: "+ result.getString("modelo"));
                                   System.out.println("Opcionais: "+ result.getString("opcionais"));
                                   System.out.println("Observacoes: "+ result.getString("observacoes"));
                                   System.out.println();
                        }
                        return veiculos;
                } catch (SQLException e) {
                    System.out.println("Erro em consultar veiculos mais procurados");
                        //Log.getLoginstance(null).error("Ocorreu um erro: "+e.getMessage());
                        return null;
                }
     }

   public ArrayList<Veiculo> consultaVeiculosMaiorRenda() {
                ArrayList<Veiculo> veiculos = new ArrayList<Veiculo>();
                Statement statement;
                ResultSet result;
                try {
                        statement = conn.createStatement();
                        result = statement.executeQuery("SELECT * FROM Veiculo ORDER BY renda");
                        while (result.next()){
                                Veiculo v = new Veiculo(result.getString("placa"), result.getString("marca"),result.getString("modelo"),
                                                                            result.getString("cor"),result.getString("tipo"), result.getString("opcionais"),result.getString("observacoes"));
                                veiculos.add(v);
                                   System.out.println("Placa: "+ result.getString("placa"));
                                   System.out.println("Marca: "+ result.getString("marca"));
                                   System.out.println("Cor: "+ result.getString("cor"));
                                   System.out.println("Tipo: "+ result.getString("tipo"));
                                   System.out.println("Modelo: "+ result.getString("modelo"));
                                   System.out.println("Opcionais: "+ result.getString("opcionais"));
                                   System.out.println("Observacoes: "+ result.getString("observacoes"));
                                   System.out.println();
                        }
                        return veiculos;
                } catch (SQLException e) {
                    System.out.println("Erro em consultar veiculos de maior renda");
                        //Log.getLoginstance(null).error("Ocorreu um erro: "+e.getMessage());
                        return null;
                }
    }

/* Função que busca todos os veículos de um determinado
* tipo
* @return listaVeiculos
*/
    public  ArrayList<Veiculo> consultaPorTipo () {
       ArrayList<Veiculo> veiculos = new ArrayList<Veiculo>();
       Statement statement;
       ResultSet result;
       String tipo;

       System.out.println ("Digite o tipo do veículo a ser pesquisado: ");
        tipo = Console.readString();

                try {
                        statement = conn.createStatement();
                        result = statement.executeQuery("SELECT * FROM Veiculo WHERE tipo = "+"'"+tipo+"'");
                        while (result.next()){
                                Veiculo v = new Veiculo(result.getString("placa"), result.getString("marca"),result.getString("modelo"),
                                                                            result.getString("cor"),result.getString("tipo"), result.getString("opcionais"),result.getString("observacoes"));
                                veiculos.add(v);
                        }
                        return veiculos;
                } catch (SQLException e) {
                    System.out.println("Erro em consultar por tipo");
                        //Log.getLoginstance(null).error("Ocorreu um erro: "+e.getMessage());
                        return null;
                }
    }

/* Função que imprime uma lista de veiculos
* @param listaVeiculos
*/
    public void imprimeLista(ArrayList<Veiculo> veiculos) {

       for (int i=0; i < veiculos.size(); i++) {
           System.out.println(i);
           System.out.println("Placa: "+ veiculos.get(i).getPlaca());
           System.out.println("Marca: "+ veiculos.get(i).getMarca());
           System.out.println("Cor: "+ veiculos.get(i).getCor());
           System.out.println("Tipo: "+ veiculos.get(i).getTipo());
           System.out.println("Modelo: "+ veiculos.get(i).getModelo());
           System.out.println("Opcionais: "+ veiculos.get(i).getOpcionais());
           System.out.println("Observacoes: "+ veiculos.get(i).getObservacoes());
           System.out.println("Número de Locacoes: "+ veiculos.get(i).getNlocacoes());
           System.out.println();
       }
   }
}
